package org.dxy.trigger.http;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dxy.api.dto.request.productionLine.CreateProductionLineRequestDto;
import org.dxy.api.dto.request.productionLine.UpdateProductionLineRequestDto;
import org.dxy.api.response.R;
import org.dxy.infrastructure.persistent.db.mybatispuls.po.query.ProductionLineBasicViewPo;
import org.dxy.trigger.http.service.ProductionLineApplicationService;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@Slf4j
@RestController
@RequestMapping("/api/productionLine")
@RequiredArgsConstructor
public class ProductionLineController {

    private final ProductionLineApplicationService productionLineApplicationService;

    /**
     * @description 创建产线
     * @param dto 包含产线创建信息的请求DTO
     * @return 返回创建成功或失败的响应
     * @date 2025/7/20 20:01
     * @auther dxy
     */
    @PostMapping("/create")
    public R<Void> createProductionLine(@Validated @RequestBody CreateProductionLineRequestDto dto) {
        return productionLineApplicationService.createProductionLine(dto);
    }

    /**
     * @description 分页查询产线列表（支持条件过滤）
     * @param page 分页参数（页码、每页大小等）
     * @param query 过滤条件（产线名称、状态、位置等）
     * @return 分页的产线列表响应
     * @date 2025/7/20 20:01
     * @auther dxy
     */
    @GetMapping("/list")
    public R<Page<ProductionLineBasicViewPo>> list(
            @ParameterObject Page<ProductionLineBasicViewPo> page,
            @ParameterObject ProductionLineBasicViewPo query) {
        return productionLineApplicationService.list(page, query);
    }

    /**
     * @description 更新产线信息
     * @param id 产线ID
     * @param dto 包含更新信息的请求DTO
     * @return 返回更新成功或失败的响应
     * @date 2025/7/20 20:01
     * @auther dxy
     */
    @PutMapping("/{id}")
    public R<Void> update(@PathVariable Long id, @Validated @RequestBody UpdateProductionLineRequestDto dto) {
        return productionLineApplicationService.update(id, dto);
    }

    /**
     * @description 删除单个产线
     * @param id 产线ID
     * @return 返回删除成功或失败的响应
     * @date 2025/7/20 20:01
     * @auther dxy
     */
    @DeleteMapping("/{id}")
    public R<Void> delete(@PathVariable Long id) {
        return productionLineApplicationService.delete(id);
    }

    /**
     * @description 批量删除产线
     * @param ids 产线ID列表
     * @return 返回批量删除成功或失败的响应
     * @date 2025/7/20 20:01
     * @auther dxy
     */
    @DeleteMapping("/batch")
    public R<Void> batchDelete(@RequestBody List<Long> ids) {
        return productionLineApplicationService.batchDelete(ids);
    }

    /**
     * @description 获取产线详情
     * @param id 产线ID
     * @return 返回产线详情信息
     * @date 2025/9/1 20:01
     * @auther dxy
     */
    @GetMapping("/{id}")
    public R<ProductionLineBasicViewPo> getById(@PathVariable Long id) {
        return productionLineApplicationService.getById(id);
    }

    /**
     * @description 获取启用状态的产线列表
     * @return 返回启用状态的产线列表
     * @date 2025/9/4 20:01
     * @auther dxy
     */
    @GetMapping("/enabled")
    public R<List<ProductionLineBasicViewPo>> getEnabledProductionLines() {
        return productionLineApplicationService.getEnabledProductionLines();
    }
}